Linux LVS 配置
NAT
Enable IP forwarding. This can be done by adding the following to
1
net.ipv4.ip_forward = 1
then
1 | ipvsadm -A -t 172.26.137.117:9376 -s rr //创建了一个rr lvs |
ipvsadm常用参数
1 | 添加虚拟服务器 |
查看连接对应的RS ip和端口
1 | ipvsadm -Lcn |grep "10.68.128.202:1406" |
当一个client访问vip的时候,ipvs或记录一条状态为NONE的信息,expire初始值是persistence_timeout的值,然后根据时钟主键变小,在以下记录存在期间,同一client ip连接上来,都会被分配到同一个后端。
FIN_WAIT的值就是tcp tcpfin udp的超时时间,当NONE的值为0时,如果FIN_WAIT还存在,那么NONE的值会从新变成60秒,再减少,直到FIN_WAIT消失以后,NONE才会消失,只要NONE存在,同一client的访问,都会分配到统一real server。
通过keepalived来检测RealServer的状态
1 | cat /etc/keepalived/keepalived.conf |
修改keepalived配置后只需要执行reload即可生效
systemctl reload keepalived
timeout
LVS的持续时间有2个
- 把同一个cip发来请求到同一台RS的持久超时时间。(-p persistent)
- 一个链接创建后空闲时的超时时间,这个超时时间分为3种。
- tcp的空闲超时时间。
- lvs收到客户端tcp fin的超时时间
- udp的超时时间
连接空闲超时时间的设置如下:
1 | [root@poc117 ~]# ipvsadm -L --timeout |
persistence_timeout
用于保证同一ip client的所有连接在timeout时间以内都发往同一个RS,比如ftp 21port listen认证、20 port传输数据,那么希望同一个client的两个连接都在同一个RS上。
persistence_timeout 会导致负载不均衡,timeout时间越大负载不均衡越严重。大多场景下基本没什么意义
PCC用来实现把某个用户的所有访问在超时时间内定向到同一台REALSERVER,这种方式在实际中不常用
1 | ipvsadm -A -t 192.168.0.1:0 -s wlc -p 600(单位是s) //port为0表示所有端口 |
此时测试一下会发现通过HTTP访问VIP和通过SSH登录VIP的时候都被定向到了同一台REALSERVER上面了
lvs 管理
1 | 257 [2021-09-13 22:11:26] lscpu |
LVS 工作原理
1.当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
2.当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
3.LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。
4.如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
5.最后经由POSTROUTING链发往后端服务器。
netfilter 原理
Netfilter 由多个表(table)组成,每个表又由多个链(chain)组成(此处可以脑补二维数组的矩阵了),链是存放过滤规则的“容器”,里面可以存放一个或多个iptables命令设置的过滤规则。目前的表有4个:raw table
, mangle table
, nat table
, filter table
。Netfilter 默认的链有:INPUT
, OUTPUT
, FORWARD
, PREROUTING
, POSTROUTING
,根据表
的不同功能需求,不同的表下面会有不同的链,链与表的关系可用下图直观表示:
OSPF + LVS
OSPF:Open Shortest Path First 开放最短路径优先,SPF算法也被称为Dijkstra算法,这是因为最短路径优先算法SPF是由荷兰计算机科学家狄克斯特拉于1959年提出的。
通过OSPF来替换keepalived,解决两个LVS节点的高可用,以及流量负载问题。keepalived两个节点只能是master-slave模式,而OSPF两个节点都是master,同时都有流量
这个架构与LVS+keepalived 最明显的区别在于,两台Director都是Master 状态,而不是Master-Backup,如此一来,两台Director 地位就平等了。剩下的问题,就是看如何在这两台Director 间实现负载均衡了。这里会涉及路由器领域的一个概念:等价多路径
ECMP(等价多路径)
ECMP(Equal-CostMultipathRouting)等价多路径,存在多条不同链路到达同一目的地址的网络环境中,如果使用传统的路由技术,发往该目的地址的数据包只能利用其中的一条链路,其它链路处于备份状态或无效状态,并且在动态路由环境下相互的切换需要一定时间,而等值多路径路由协议可以在该网络环境下同时使用多条链路,不仅增加了传输带宽,并且可以无时延无丢包地备份失效链路的数据传输。
ECMP最大的特点是实现了等值情况下,多路径负载均衡和链路备份的目的,在静态路由和OSPF中基本上都支持ECMP功能。
参考资料
http://www.ultramonkey.org/papers/lvs_tutorial/html/
https://www.jianshu.com/p/d4222ce9b032